﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using RESTServicesMov.Persistencia;
using RESTServicesMov.Dominio;
using RESTServicesMov.Excepciones;
using System.Net;


namespace RESTServicesMov
{
    
    public class Movimientos : IMovimientos
    {
        private PedidoDAO dao = new PedidoDAO();

        public List<PedidoDetalle> Consultar(string codigo)
        {
            
            int id = Convert.ToInt32(codigo);
            string status = "A";
            return dao.ObtenerDetalle(id,status);
            
        }


        private PedidoDetalleDAO daoDet = new PedidoDetalleDAO();
        private PedidoDAO daoPed = new PedidoDAO();
        private CentroProdDAO daoCentroProd = new CentroProdDAO();
        private MovimientoDAO daoMov = new MovimientoDAO();
        private MovDetalleDAO daoMovDet = new MovDetalleDAO();


        public List<PedidoDetalle> ObtenerDetalle(string id)
        {
            int idped = Int32.Parse(id);
            return daoDet.ObtenerDetalle(idped);
        }

        public Pedido ObtenerPedidoIngreso(string id)
        {
            int idped = Int32.Parse(id);
            Pedido pedido;
            pedido = daoPed.Obtener(idped);

            if (pedido != null)
            {
                if (pedido.tipped == "PC")//correcto
                {
                    if (pedido.estado == "L")
                        return pedido;
                    else
                    {
                        throw new WebFaultException<Excepcion>(
                             new Excepcion()
                             {
                                 Mensaje = "El  N° de Pedido " + id + " está atendido o en tratamiento."
                             }, HttpStatusCode.InternalServerError);
                    }
                }
                else//excepcion
                {
                    throw new WebFaultException<Excepcion>(
                              new Excepcion()
                              {
                                  Mensaje = "El N° de Pedido " + id + " no es un Pedido de Ingreso."
                              }, HttpStatusCode.InternalServerError);
                }
            }
            else
            {
                throw new WebFaultException<Excepcion>(
                             new Excepcion()
                             {
                                 Mensaje = "El  N° de Pedido " + id + " no está registrado en el sistema."
                             }, HttpStatusCode.InternalServerError);
            }
        }

        public Pedido ObtenerPedidoSalida(string id)
        {
            int idped = Int32.Parse(id);
            Pedido pedido;
            pedido = daoPed.Obtener(idped);

            if (pedido != null)
            {
                if (pedido.tipped == "PV")//correcto
                {
                    if (pedido.estado == "L")
                        return pedido;
                    else
                    {
                        throw new WebFaultException<Excepcion>(
                             new Excepcion()
                             {
                                 Mensaje = "El  N° de Pedido " + id + " está atendido o en tratamiento."
                             }, HttpStatusCode.InternalServerError);
                    }
                }
                else//excepcion
                {
                    throw new WebFaultException<Excepcion>(
                              new Excepcion()
                              {
                                  Mensaje = "El N° de Pedido " + id + " no es un Pedido de Venta."
                              }, HttpStatusCode.InternalServerError);
                }
            }
            else
            {
                throw new WebFaultException<Excepcion>(
                             new Excepcion()
                             {
                                 Mensaje = "El  N° de Pedido " + id + " no está registrado en el sistema."
                             }, HttpStatusCode.InternalServerError);
            }
        }//fin de metodo ObtenerPedidoSalida

        // CentroProd+++
        public CentroProd CrearCentroProd(string centro, string producto, string stock, string stockMin, string stockMax)
        {
            int vcentro = Int32.Parse(centro);
            int vproducto = Int32.Parse(producto);
            int vstock = Int32.Parse(stock);
            int vstockMin = Int32.Parse(stockMin);
            int vstockMax = Int32.Parse(stockMax);

            return daoCentroProd.Crear(vcentro, vproducto, vstock, vstockMin, vstockMax);
        }

        public CentroProd ObtenerCentroProd(string centro, string producto)
        {
            int vcentro = Int32.Parse(centro);
            int vproducto = Int32.Parse(producto);

            return daoCentroProd.ObtenerAlmacenProd(vcentro, vproducto);
        }

        public CentroProd ModificarCentroProd(CentroProd centroProdAModificar)
        {
            return daoCentroProd.Modificar(centroProdAModificar);
        }

        public List<CentroProd> ListarCentroProd()
        {
            List<CentroProd> lista;
             
            lista = daoCentroProd.ListarTodos();
            if (lista.Count > 0)
                return lista;
            else
            {
                throw new WebFaultException<Excepcion>(
                      new Excepcion()
                      {
                          Mensaje = "Ocurrio un error al obtener la lista"
                      }, HttpStatusCode.InternalServerError);
            }
        }
        // CentroProd---


        public Movimiento RegistrarSalida(Movimiento movACrear)
        {
            return daoMov.CrearMovimiento(movACrear);
        }


        public MovDetalle RegistrarSalidaItems(MovDetallePOST itemACrear)
        {
            return daoMovDet.CrearItemMov(itemACrear);
        }


        public Movimiento RegistrarIngreso(Movimiento movACrear)
        {
            return daoMov.CrearMovimiento(movACrear);
        }

        public MovDetalle RegistrarIngresoItems(MovDetallePOST itemACrear)
        {
            return daoMovDet.CrearItemMov(itemACrear);
        }
    }
}
